home *** CD-ROM | disk | FTP | other *** search
-
- The USENET MIDI Primer
- Bob McQueer
-
- PURPOSE
-
- It seems as though many people in the USENET community have an interest
- in the Musical Instrument Digital Interface (MIDI), but for one reason
- or another have only obtained word of mouth or fragmentary descriptions
- of the specification. Basic questions such as "what's the baud rate?",
- "is it EIA?" and the like seem to keep surfacing in about half a dozen
- newsgroups. This article is an attempt to provide the basic data to
- the readers of the net.
-
- REFERENCE
-
- The major written reference for this article is version 1.0 of the MIDI
- specification, published by the International MIDI Association, copyright
- 1983. There exists an expanded document. This document, which I have not
- seen, is simply an expansion of the 1.0 spec. to contain more explanatory
- material, and fill in some areas of hazy explanation. There are no
- radical departures from 1.0 in it. I have also heard of a "2.0" spec.,
- but the IMA claims no such animal exists. In any event, backwards
- compatibility with the information I am presenting here should be
- maintained.
-
- CONVENTIONS
-
- I will give constants in C syntax, ie. 0x for hexadecimal. If I
- refer to bits by number, I number them starting with 0 for the low
- order (1's place) bit. The following notation:
-
- >>
-
- text
-
- <<
-
- will be used to delimit commentary which is not part of the "bare-
- bones" specification. A sentence or paragraph marked with a question
- mark in column 1 is a point I would kind of like to hear something
- about myself.
-
- OK, let's give it a shot.
-
- PHYSICAL CONNECTOR SPECIFICATION
-
- The standard connectors used for MIDI are 5 pin DIN. Separate sockets
- are used for input and output, clearly marked on a given device. The
- spec. gives 50 feet as the maximum cable length. Cables are to be
- shielded twisted pair, with the shield connecting pin 2 at both ends.
- The pair is pins 4 and 5, pins 1 and 3 being unconnected:
-
- 2
- 5 4
- 3 1
-
- A device may also be equipped with a "MIDI-THRU" socket which is used
- to pass the input of one device directly to output.
-
- >>
- I think this arrangement shows some of the original conception
- of MIDI more as a way of allowing keyboardists to control
- multiple boxes than an instrument to computer interface. The
- "daisy-chain" arrangement probably has advantages for a performing
- musician who wants to play "stacked" synthesizers for a desired
- sound, and has to be able to set things up on the road.
- <<
-
- ELECTRICAL SPECIFICATION
-
- Asynchronous serial interface. The baud rate is 31.25 Kbaud (+/- 1%).
- There are 8 data bits, with 1 start bit and 1 stop bit, for 320
- microseconds per serial byte.
-
- MIDI is current loop, 5 mA. Logic 0 is current ON. The specification
- states that input is to be opto-isolated, and points out that Sharp
- PC-900 and HP 6N138 optoisolators are satisfactory devices. Rise and
- fall time for the optoisolator should be less than 2 microseconds.
-
- The specification shows a little circuit diagram for the connections
- to a UART. I am not going to reproduce it here. There's not much
- to it - I think the important thing it shows is +5 volt connection
- to pin 4 of the MIDI out with pin 5 going to the UART, through 220
- ohm load resistors. It also shows that you're supposed to connect
- to the "in" side of the UART through an optoisolator, and to the
- MIDI-THRU on the UART side of the isolator.
-
- >>
- I'm not much of a hardware person, and don't really know what
- I'm talking about in paragraphs like the three above. I DO
- recognize that this is a "non-standard" specification, which
- won't work over serial ports intended for anything else. People
- who do know about such things seem to either have giggling
- or gagging fits when they see it, depending on their dispos-
- itions, saying things like "I haven't seen current loop since
- the days of the old teletypes". I also know the fast 31.25
- Kbaud pushes the edge for clocking commonly available UART's.
- <<
-
- DATA FORMAT
-
- For standard MIDI messages, there is a clear concept that one device
- is a "transmitter" or "master", and the other a "receiver" or "slave".
- Messages take the form of opcode bytes, followed by data bytes.
- Opcode bytes are commonly called "status" bytes, so we shall use
- this term.
-
- >>
- very similar to handling a terminal via escape sequences. There
- aren't ACK's or other handshaking mechanisms in the protocol.
- <<
-
- Status bytes are marked by bit 7 being 1. All data bytes must
- contain a 0 in bit 7, and thus lie in the range 0 - 127.
-
- MIDI has a logical channel concept. There are 16 logical channels,
- encoded into bits 0 - 3 of the status bytes of messages for
- which a channel number is significant. Since bit 7 is taken over
- for marking the status byte, this leaves 3 opcode bits for message
- types with a logical channel. 7 of the possible 8 opcodes are
- used in this fashion, reserving the status bytes containing all
- 1's in the high nibble for "system" messages which don't have a
- channel number. The low order nibble in these remaining messages
- is really further opcode.
-
- >>
- If you are interested in receiving MIDI input, look over the
- SYSTEM messages even if you wish to ignore them. Especially the
- "system exclusive" and "real time" messages. The real time
- messages may be legally inserted in the middle of other data,
- and you should be aware of them, even though many devices won't
- use them.
- <<
-
- VOICE MESSAGES
-
- I will cover the message with channel numbers first. The opcode determines
- the number of data bytes for a single message (see "running status byte",
- below). The specification divides these into "voice" and "mode" messages.
- The "mode" messages are for control of the logical channels, and the control
- opcodes are piggybacked onto the data bytes for the "parameter" message.
- I will go into this after describing the "voice messages". These messages are:
-
- status byte meaning data bytes
-
- 0x80-0x8f note off 2 - 1 byte pitch, followed by 1 byte velocity
- 0x90-0x9f note on 2 - 1 byte pitch, followed by 1 byte velocity
- 0xa0-0xaf key pressure 2 - 1 byte pitch, 1 byte pressure (after-touch)
- 0xb0-0xbf parameter 2 - 1 byte parameter number, 1 byte setting
- 0xc0-0xcf program 1 byte program selected
- 0xd0-0xdf chan. pressure 1 byte channel pressure (after-touch)
- 0xe0-0xef pitch wheel 2 bytes gives a 14 bit value, least significant
- 7 bits first
-
- Many explanations are necessary here:
-
- For all of these messages, a convention called the "running status
- byte" may be used. If the transmitter wishes to send another message
- of the same type on the same channel, thus the same status byte, the
- status byte need not be resent.
-
- Also, a "note on" message with a velocity of zero is to be synonymous
- with a "note off". Combined with the previous feature, this is intended
- to allow long strings of notes to be sent without repeating status bytes.
-
- >>
- From what I've seen, the "zero velocity note on" feature is very
- heavily used. My six-trak sends these, even though it sends
- status bytes on every note anyway. Roland stuff uses it.
- <<
-
- The pitch bytes of notes are simply number of half-steps, with middle C = 60.
-
- >>
- On keyboard synthesizers, this usually simply means which
- physical key corresponds, since the patch selection will
- change the actual pitch range of the keyboard. Most keyboards
- have one C key which is unmistakably in the middle of the
- keyboard. This is probably note 60.
- <<
-
- The velocity bytes for velocity sensing keyboards are supposed
- to represent a logarithmic scale. "advisable" in the words
- of the spec. Non-velocity sensing devices are supposed to
- send velocity 64.
-
- The pitch wheel value is an absolute setting, 0 - 0x3FFF. The
- 1.0 spec. says that the increment is determined by the receiver.
- 0x2000 is to correspond to a centered pitch wheel (unmodified notes)
-
- >>
- I believe standard scale steps are one of the things discussed
- in expansions. The six-trak pitch wheel is up/down about a third.
- I believe several makers have used this value, but I may be wrong.
-
- The "pressure" messages are for keyboards which sense the amount
- of pressure placed on an already depressed key, as opposed to
- velocity, which is how fast it is depressed or released.
-
- ? I'm not really certain of how "channel" pressure works. Yamaha
- is one maker that uses these messages, I know.
- <<
-
- Now, about those parameter messages.
-
- Instruments are so fundamentally different in the various controls
- they have that no attempt was made to define a standard set, like
- say 9 for "Filter Resonance". Instead, it was simply assumed that
- these messages allow you to set "controller" dials, whose purposes
- are left to the given device, except as noted below. The first data
- bytes correspond to these "controllers" as follows:
-
- data byte
-
- 0 - 31 continuous controllers 0 - 31, most significant byte
- 32 - 63 continuous controllers 0 - 31, least significant byte
- 64 - 95 on / off switches
- 96 - 121 unspecified, reserved for future.
- 122 - 127 the "channel mode" messages I alluded to above. See below.
-
- The second data byte contains the seven bit setting for the controller.
- The switches have data byte 0 = OFF, 127 = ON with 1 - 126 undefined.
- If a controller only needs seven bits of resolution, it is supposed to
- use the most significant byte. If both are needed, the order is
- specified as most significant followed by least significant. With a
- 14 bit controller, it is to be legal to send only the least significant
- byte if the most significant doesn't need to be changed.
-
- >>
- This may of, course, wind up stretched a bit by a given manufacturer.
- The Six-Trak, for instance, uses only single byte values (LEFT
- justified within the 7 bits at that), and recognizes >32 parameters
- <<
-
- Controller number 1 IS standardized to be the modulation wheel.
-
- ? Are there any other standardizations which are being followed by most
- manufacturers?
-
- MODE MESSAGES
-
- These are messages with status bytes 0xb0 through 0xbf, and leading data
- bytes 122 - 127. In reality, these data bytes function as further
- opcode data for a group of messages which control the combination of
- voices and channels to be accepted by a receiver.
-
- An important point is that there is an implicit "basic" channel over which
- a given device is to receive these messages. The receiver is to ignore
- mode messages over any other channels, no matter what mode it might be in.
- The basic channel for a given device may be fixed or set in some manner
- outside the scope of the MIDI standard.
-
- The meaning of the values 122 through 127 is as follows:
-
- data byte second data byte
- 122 local control 0 = local control off, 127 = on
- 123 all notes off 0
- 124 omni mode off 0
- 125 omni mode on 0
- 126 monophonic mode number of monophonic channels, or 0
- for a number equal to receivers voices
- 127 polyphonic mode 0
-
- 124 - 127 also turn all notes off.
-
- Local control refers to whether or not notes played on an instruments
- keyboard play on the instrument or not. With local control off, the
- host is still supposed to be able to read input data if desired, as
- well as sending notes to the instrument. Very much like "local echo"
- on a terminal, or "half duplex" vs. "full duplex".
-
- The mode setting messages control what channels / how many voices the
- receiver recognizes. The "basic channel" must be kept in mind. "Omni"
- refers to the ability to receive voice messages on all channels. "Mono"
- and "Poly" refer to whether multiple voices are allowed. The rub is
- that the omni on/off state and the mono/poly state interact with each
- other. We will go over each of the four possible settings, called "modes"
- and given numbers in the specification:
-
- mode 1 - Omni on / Poly - voice messages received on all channels and
- assigned polyphonically. Basically, any notes it gets, it
- plays, up to the number of voices it's capable of.
-
- mode 2 - Omni on / Mono - monophonic instrument which will receive
- notes to play in one voice on all channels.
-
- mode 3 - Omni off / Poly - polyphonic instrument which will receive
- voice messages on only the basic channel.
-
- mode 4 - Omni off / Mono - A useful mode, but "mono" is a misnomer.
- To operate in this mode a receiver is supposed to receive
- one voice per channel. The number channels recognized will be
- given by the second data byte, or the maximum number of possible
- voices if this byte is zero. The set of channels thus defined
- is a sequential set, starting with the basic channel.
-
- The spec. states that a receiver may ignore any mode that it cannot
- honor, or switch to an alternate - "usually" mode 1. Receivers are
- supposed to default to mode 1 on power up. It is also stated that
- power up conditions are supposed to place a receiver in a state where
- it will only respond to note on / note off messages, requiring a
- setting of some sort to enable the other message types.
-
- >>
- I think this shows the desire to "daisy-chain" devices for
- performance from a single master again. We can set a series
- of instruments to different basic channels, tie 'em together,
- and let them pass through the stuff they're not supposed to
- play to someone down the line.
-
- This suffers greatly from lack of acknowledgement concerning
- modes and usable channels by a receiver. You basically have
- to know your device, what it can do, and what channels it can
- do it on.
-
- I think most makers have used the "system exclusive" message
- (see below) to handle channels in a more sophisticated manner,
- as well as changing "basic channel" and enabling receipt of
- different message types under host control rather than by
- adjustment on the device alone.
-
- The "parameters" may also be usurped by a manufacturer for
- mode control, since their purposes are undefined.
-
- Another HUGE problem with the "daisy-chain" mental set of MIDI
- is that most devices ALWAYS shovel whatever they play to their
- MIDI outs, whether they got it from the keyboard or MIDI in.
- This means that you have to cope with the instrument echoing
- input back at you if you're trying to do an interactive session
- with the synthesizer. There is DRASTIC need for some MIDI flag
- which specifically means that only locally generated data is to
- go to MIDI out. From device to device there are ways of coping
- with this, none of them good.
- <<
-
- SYSTEM MESSAGES
-
- The status bytes 0x80 - 0x8f do not have channel numbers in the
- lower nibble. These bytes are used as follows:
-
- byte purpose data bytes
-
- 0xf0 system exclusive variable length
- 0xf1 undefined
- 0xf2 song position 2 - 14 bit value, least significant byte first
- 0xf3 song select 1 - song number
- 0xf4 undefined
- 0xf5 undefined
- 0xf6 tune request 0
- 0xf7 EOX (terminator) 0
-
- The status bytes 0xf8 - 0xff are the so-called "real-time" messages.
- I will discuss these after the accumulated notes concerning the
- first bunch.
-
- Song position / song select are for control of sequencers. The
- song position is in beats, which are to be interpreted as every
- 6 MIDI clock pulses. These messages determine what is to be played
- upon receipt of a "start" real-time message (see below).
-
- The "tune request" is a command to analog synthesizers to tune their
- oscillators.
-
- The system exclusive message is intended for manufacturers to use
- to insert any specific messages they want to which apply to their
- own product. The following data bytes are all to be "data" bytes,
- that is they are all to be in the range 0 - 127. The system exclusive
- is to be terminated by the 0xf7 terminator byte. The first data byte
- is also supposed to be a "manufacturer's id", assigned by a MIDI
- standards committee. THE TERMINATOR BYTE IS OPTIONAL - a system
- exclusive may also be "terminated" by the status byte of the next
- message.
-
- >>
- Yamaha, in particular, caused problems by not sending terminator
- bytes. As I understand it, the DX-7 sends a system exclusive
- at something like 80 msec. intervals when it has nothing better
- to do, just so you know it's still there, I guess. The messages
- aren't explicitly terminated, so if you want to handle the
- protocol (esp. in hardware), you should be aware that a DX-7
- will leave you in "waiting for EOX" state a lot, and be sending
- data even when it isn't doing anything. This is all word of
- mouth, since I've never personally played with a DX-7.
- <<
-
- some MIDI ID's:
-
- Sequential Circuits 1 Bon Tempi 0x20 Kawai 0x40
- Big Briar 2 S.I.E.L. 0x21 Roland 0x41
- Octave / Plateau 3 Korg 0x42
- Moog 4 SyntheAxe 0x23 Yamaha 0x43
- Passport Designs 5
- Lexicon 6
- PAIA 0x11
- Simmons 0x12
- Gentle Electric 0x13
- Fairlight 0x14
-
- >>
- Note the USA / Europe / Japan grouping of codes. Also note
- that Sequential Circuits snarfed id number 1 - Sequential
- Circuits was one of the earliest participators in MIDI, some
- people claim its originator.
-
- Two large makers missing from the original lineup were Casio
- and Oberheim. I know Oberheim is on the bandwagon now, and
- Casio also, I believe. Oberheim had their own protocol previous
- to MIDI, and when MIDI first came out they were reluctant to
- ? go along with it. I wonder what we'd be looking at if Oberheim
- had pushed their ideas and made them the standard. From what I
- understand they thought THEIRS was better, and kind of sulked
- for a while until the market forced them to go MIDI.
-
- ? Nobody seems to care much about these ID numbers. I can only
- imagine them becoming useful if additions to the standard message
- set are placed into system exclusives, with the ID byte to let
- you know what added protocol is being used. Are any groups of
- manufacturers considering consolidating their efforts in a
- standard extension set via system exclusives?
- <<
-
- REAL TIME MESSAGES.
-
- This is the final group of status bytes, 0xf8 - 0xff. These bytes
- are reserved for messages which are called "real-time" messages
- because they are allowed to be sent ANYPLACE. This includes in
- between data bytes of other messages. A receiver is supposed to
- be able to receive and process (or ignore) these messages and
- resume collection of the remaining data bytes for the message
- which was in progress. Realtime messages do not affect the
- "running status byte" which might be in effect.
-
- ? Do any devices REALLY insert these things in the middle of
- other messages?
-
- All of these messages have no data bytes following (or they could
- get interrupted themselves, obviously). The messages:
-
- 0xf8 timing clock
- 0xf9 undefined
- 0xfa start
- 0xfb continue
- 0xfc stop
- 0xfd undefined
- 0xfe active sensing
- 0xff system reset
-
- The timing clock message is to be sent at the rate of 24 clocks
- per quarter note, and is used to sync. devices, especially drum
- machines.
-
- Start / continue / stop are for control of sequencers and drum
- machines. The continue message causes a device to pick up at the
- next clock mark.
-
- >>
- These things are also designed for performance, allowing control
- of sequencers and drum machines from a "master" unit which
- sends the messages down the line when its buttons are pushed.
-
- I can't tell you much about the trials and tribulations of drum
- machines. Other folks can, I am sure.
- <<
-
- The active sensing byte is to be sent every 300 ms. or more often,
- if it is used. Its purpose is to implement a timeout mechanism
- for a receiver to revert to a default state. A receiver is to
- operate normally if it never gets one of these, activating the
- timeout mechanism from the receipt of the first one.
-
- >>
- My impression is that active sensing is largely unused.
- <<
-
- The system reset initializes to power up conditions. The spec. says
- that it should be used "sparingly" and in particular not sent
- automatically on power up.
-
- AND NOW, CLIMBING TO THE PULPIT ....
-
- >> - from here on out.
-
- There are many deficiencies with MIDI, but it IS a standard. As such,
- it will have to be grappled with.
-
- The electrical specification leaves me with only one question - WHY?
- What was wanted was a serial interface, and a perfectly good RS232
- specification was to be had. WHY wasn't it used? The baud rate is
- too fast to simply convert into something you can feed directly to
- your serial port via fairly dumb hardware, also. The "standard"
- baud rate step you would have to use would be 38.4 Kbaud which very
- few hardware interfaces accept. The other alternative is to buffer
- messages and send them out a slower baud rate - in fact buffering
- of characters by some kind of I/O processor is very helpful. Hence
- units like the MPU-401, which does a lot of other stuff, too of course.
-
- The fast baud rate with MIDI was set for two reasons I believe:
-
- 1) to allow daisy-chaining of a few devices with no noticeable
- end to end lag.
-
- 2) to allow chords to be played by just sending all the notes down
- the pipe, the baud rate being fast enough that they will
- sound simultaneous.
-
- It doesn't exactly work - I've heard gripes concerning end to end lag
- on three instrument chains. And consider chords - at two bytes (running
- status byte being used) per note, there will be a ten character lag
- between the trailing edges of the first and last notes of a six note
- chord. That's 3.2 ms., assuming no "dead air" between characters. It's
- still pretty fast, but on large chords with voices possessing distinctive
- attack characteristics, you may hear separate note beginnings.
-
- I think MIDI could have used some means of packetizing chords, or having
- transaction markers. If a "chord" message were specified, you could
- easily
- break even on byte count with a few notes, given that we assume all notes
- of a chord at the same velocity. Transaction markers might be useful in
- any case, although I don't know if it would be worth taking over the
- remaining system message space for them. I would say yes. I would
- see having "start" and "end" transaction bytes. On receipt of a "start"
- a receiver buffers up but does not act on messages until receipt of the
- "end" byte. You could then do chords by sending the notes ahead of time,
- and precisely timing the "end" marker. Of course, the job of the hardware
- in the receiver has been complicated considerably.
-
- The protocol is VERY keyboard oriented - take a look at the use of TWO
- of the opcodes in the limited opcode space for "pressure" messages,
- and the inability to specify semitones or glissando effects except
- through the pitch wheel (which took up yet ANOTHER of the opcodes).
- All keyboards I know of modify ALL playing notes when they receive
- pitch wheel data. Also, you have to use a continuous stream of
- pitch wheel messages to effect a slide, the pitch wheel step isn't
- standardized, and on a slide of a large number of tones you will
- overrun the range of the wheel.
-
- ? Some of these problems would be addressed by a device which allowed
- its pitch wheel to have selective control - say modifying only
- the notes playing on the channel the pitch wheel message is
- received in, for instance. The thing for a guitar synthesizer
- to do, then, would be to use mode 4, one channel per string, and
- bends would only affect the one note. You could play a chord
- on a voice with a lot of release, then bend a note and not have
- the entire still sounding chord bend. Any such devices?
-
- I think some of the deficiencies in MIDI might be addressed by
- different communities of interest developing a standard set of
- system exclusives which answer the problem. One perfect area
- for this, I think, is a standard set for representation of "non-
- keyboard / drum machine" instruments which have continuous pitch
- capabilities. Like a pedal steel, for instance. Or non-western
- intervals. Like a sitar.
-
- There is a crying need to do SOMETHING about the "loopback" problem.
- I would even vote for usurping a few more bytes in the mode messages
- to allow you to TURN OFF input echo by the receiver. With the
- local control message, you could then at least deal with something
- that would act precisely like a half or full duplex terminal.
- Several patchwork solutions exist to this problem, but there OUGHT
- to be a standard way of doing it within the protocol. Another
- thought is to allow data bytes of other than 0 or 127 to control
- echo on the existing local control message.
-
- The lack of acknowledgement is a problem. Another candidate for a
- standard system exclusive set would be a series of messages for
- mode setting with acknowledgement. This set could then also
- take care of the loopback problem.
-
- The complete lack of ability to specify standardized waveforms is
- probably another source of intense disappointment to many readers.
- Trouble is, the standard lingo used by the synthesizer industry and
- most working musicians is something which hails back to the first
- days of synthesizer design, deals with envelope generators and
- filters and VCO / LFO hardware parameters, and is very damn difficult
- to relate to Fourier series expressing the harmonic content or any other
- abstractions some people interested in doing computer composition
- would like. The parameter set used by the average synthesizer
- manufacturer isn't anyplace close to orthogonal in any sense, and is bound
- to vary wildly in comparison to anybody elses. There are essentially no
- abstractions made by most of the industry from underlying hardware
- parameters. What standardization exists reflects only the similarity
- in hardware. This is one quagmire that we have a long way to go to
- get out of, I think. It might be possible, eventually, to come up
- with translation tables describing the best way to approximate a
- desired sound on a given device in terms of its parameter set, but
- the difficulties are enormous. MIDI has chosen to punt on this one, folks.
-
- Well, that's about it. Good luck with talking to your synthesizer.
-
- Bob McQueer
- 22 Bcy, 3151
-
- All rites reversed. Reprint what you like.
-
-
- z MAILER UHCCUX 4/07/89
- 'lee@uhccux eharnden@auvm 4/07/89 midi-intro
-
- % ====== Internet headers and postmarks (see DECWRL::GATEWAY.DOC) ======
- Received: by decpa.pa.dec.com; id AA00156; Fri, 21 Dec 90 17:21:05 -0800
- Received: by decwrl.dec.com; id AA00145; Fri, 21 Dec 90 17:13:28 -0800
- Message-Id: <9012220113.AA00145@decwrl.dec.com>
- Received: from AUVM.BITNET by CUNYVM.CUNY.EDU (IBM VM SMTP R1.2.2MX) with BSMTP id 7316; Fri, 21 Dec 90 20:12:17 EST
- Received: by AUVM (Mailer R2.07) id 6648; Fri, 21 Dec 90 20:09:38 EST
- Date: Fri, 21 Dec 90 20:09:36 EST
- From: Revised List Processor (1.6e) <LISTSERV%AUVM.BITNET@CUNYVM.CUNY.EDU>
- Subject: File: "PRIMER MIDISPEC" being sent to you
- To: SKIVT::hearn
-